package it.csi.finregio.finreges.presentation.action;

import it.crp.crparch.web.struts.service.WebServiceException;
import it.crp.exception.ServiceException;
import it.crp.logger.PrdLoggerFactory;
import it.csi.finregio.finreges.client.ServiceLocator;
import it.csi.finregio.finreges.client.finders.FinderService;
import it.csi.finregio.finreges.dto.Classificazione;
import it.csi.finregio.finreges.dto.Direzione;
import it.csi.finregio.finreges.dto.Ente;
import it.csi.finregio.finreges.integration.FinregioService;
import it.csi.finregio.finreges.presentation.form.SchedaForm;

import java.util.ArrayList;
import java.util.Collection;
import java.util.ResourceBundle;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class FinregioActionHelper {

	private static Logger log = PrdLoggerFactory.getInstance().getLogger(
			"finreges");
	private static ResourceBundle messages=ResourceBundle.getBundle("messages");
	
	/**
	 * Carica i dati necessari alla corretta visualizzazione della pagina
	 * 
	 * @param request
	 * @param type
	 * @throws WebServiceException
	 */
	public static void loadData4Page(ActionForm form,
			HttpServletRequest request, String type) throws WebServiceException {
		log.info("[FinregioActionHelper::loadData4Page] BEGIN");
		if (type.equals("classificazione")) {
			loadListaClassificazioni(request, form);
			loadListaSottoClassificazioni(request, form);
			loadListaStati(request, form);
		}
		if (type.equals("riferimenti") || "gestiprif".equals(type)) {
			loadListaTipoRiferimento(request, form);
		}
		if (type.equals("assente")) {
			loadListaAssessorati(request, form);
			loadListaAltriEnti(request, form);
			caricaListaCompleta(request);

			if (getSchedaForm(form).getTabellaInformazioniAssEnte() != null
					&& getSchedaForm(form).getTabellaInformazioniAssEnte()
							.size() > 0) {
				request.setAttribute("infoAssEnteInserito", getSchedaForm(form)
						.getTabellaInformazioniAssEnte());
			}

		}
		if (type.equals("ricerca")) {
			loadListaAnni(request, form);
			loadListaClassificazioni(request, form);
			loadListaSottoClassificazioni(request, form);
			loadListaAssessorati(request, form);
			loadListaAltriEnti(request, form);

		}
		if (type.equals("stampa")) {
			loadListaClassificazioni(request, form);
			loadListaSottoClassificazioni(request, form);
		}
		if(type.equals("gesclassificazione")){
			loadListaClassificazioni(request, form);
			loadListaSottoClassificazioni(request, form);
		}
		if (type.equals("gesassdirset") ) {
			loadListaAssessorati(request, form);
		}
		if (type.equals("gesaltroente") ) {
			loadListaAltriEnti(request, form);
		}


	}

	private static void loadListaAnni(HttpServletRequest request,
			ActionForm form) throws WebServiceException {

		log.info("[FinregioActionHelper::loadListaAnni] BEGIN");
		FinderService finderService = getFinderService();
		HttpSession session = getSession(request);
		Collection listaAnni = (Collection) session
				.getAttribute("listaAnni");
		if (listaAnni == null) {
			listaAnni = finderService.getListaAnni();
			session.setAttribute("listaAnni", listaAnni);
		}
		log.info("[FinregioActionHelper::loadListaAnni] END");

	}

	/**
	 * Unisce la lista di altri enti e assessorati per la selezione non standard
	 * 
	 * @param request
	 * @throws WebServiceException
	 */

	private static void caricaListaCompleta(HttpServletRequest request)
			throws WebServiceException {
		log.info("[FinregioActionHelper::mergeEnti] BEGIN");
		try {
			Collection tuuuuttiGliEnti = (Collection) getSession(request)
					.getAttribute("listaCompletaEnti");
			if (tuuuuttiGliEnti == null) {
				tuuuuttiGliEnti = getFinderService().getListaCompletaEnti();
				getSession(request).setAttribute("listaCompletaEnti",
						tuuuuttiGliEnti);
			}
			Collection listaTutteDirezioni = (Collection) getSession(request)
					.getAttribute("listaCompletaDirezioni");
			FinderService finderService = getFinderService();
			if (listaTutteDirezioni == null) {
				listaTutteDirezioni = finderService.getListaDirezioni();
				getSession(request).setAttribute("listaCompletaDirezioni",
						listaTutteDirezioni);
			}
			Collection listaTuttiSettori = (Collection) getSession(request)
					.getAttribute("listaCompletaSettori");
			if (listaTuttiSettori == null) {
				listaTuttiSettori = finderService.getListaSettori();
				getSession(request).setAttribute("listaCompletaSettori",
						listaTuttiSettori);
			}
		} catch (WebServiceException e) {
			log
					.error("[FinregioActionHelper::mergeEnti]  "
							+ e.getMessage(), e);
			throw e;
		} finally {
			log.info("[FinregioActionHelper::mergeEnti] END");
		}

	}

	public static void loadListaAltriEnti(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaAltriEnti] BEGIN");
		HttpSession session = getSession(request);

		Collection listaAltriEnti = (Collection) session
				.getAttribute("listaAltriEnti");
		if (listaAltriEnti == null) {
			FinderService service = getFinderService();
			listaAltriEnti = service.getListaAltriEnti();
			session.setAttribute("listaAltriEnti", listaAltriEnti);
		}
		log.info("[FinregioActionHelper::loadListaAltriEnti] END");

	}

	public static void loadListaAssessorati(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaAssessorati] BEGIN");
		HttpSession session = getSession(request);

		Collection listaAssessorati = (Collection) session
				.getAttribute("listaAssessorati");
		if (listaAssessorati == null) {
			FinderService service = getFinderService();
			listaAssessorati = service.getListaAssessorati();
			session.setAttribute("listaAssessorati", listaAssessorati);
		}
		log.info("[FinregioActionHelper::loadListaAssessorati] END");
	}

	public static void loadListaDirezioni(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaDirezioni] BEGIN");
		FinderService service = getFinderService();

		Collection listaDirezioni = service.getListaDirezioni();

		request.setAttribute("listaDirezioni", listaDirezioni);
		log.info("[FinregioActionHelper::loadListaDirezioni] END");
	}

	public static void loadListaSettori(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaSettori] BEGIN");
		FinderService service = getFinderService();
		Collection listaSettori = service.getListaSettori();
		request.setAttribute("listaSettori", listaSettori);
		log.info("[FinregioActionHelper::loadListaSettori] END");
	}

	public static void loadListaSettoriByDirezione(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaSettoriByDirezione] BEGIN");
		try {
			SchedaForm sf = getSchedaForm(form);
			Direzione direzione = new ServiceLocator().getFinRegioService()
					.getDirezioneByProgressivo(sf.getProgressivoDirezione());
			FinderService service = getFinderService();
			Collection listaSettori = service
					.getListaSettoriByDirezione(direzione);
			request.setAttribute("listaSettori", listaSettori);
		} catch (ServiceException e) {
			log.error("[FinregioActionHelper::loadListaSettoriByDirezione]  "
					+ e.getMessage(), e);
			throw new WebServiceException(e.getMessage());
		} finally {
			log.info("[FinregioActionHelper::loadListaSettoriByDirezione] END");
		}
	}

	public static void loadListaDirezioniByEnte(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaDirezioniByEnte] BEGIN");
		SchedaForm sf = getSchedaForm(form);
		Ente ente = new Ente(sf.getIdEnte());
		FinderService service = getFinderService();
		Collection listaDirezioni = service.getListaDirezioniByEnte(ente);
		getSession(request).setAttribute("listaDirezioni", listaDirezioni);
		log.info("[FinregioActionHelper::loadListaDirezioniByEnte] END");
	}

	public static void loadListaTipoRiferimento(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaTipoRiferimento] BEGIN");
		SchedaForm sf = getSchedaForm(form);
		try {
			FinregioService service = new ServiceLocator().getFinRegioService();
			HttpSession session = getSession(request);

			Collection results = (Collection) session
					.getAttribute("listaRiferimenti");
			if (results == null) {
				results = service.getListaTipoRiferimento();
				session.setAttribute("listaRiferimenti", results);
			}
			request.setAttribute("tabellaRiferimentiNormativi", sf
					.getTabellaRiferimentiNormativi());
			request.setAttribute("listaRiferimenti", results);
		} catch (ServiceException e) {
			log.error("[FinregioActionHelper::loadListaTipoRiferimento]  "
					+ e.getMessage(), e);
			throw new WebServiceException(e.getMessage());
		} finally {
			log.info("[FinregioActionHelper::loadListaTipoRiferimento] END");
		}

	}

	/**
	 * @param form
	 * @return
	 */
	public static SchedaForm getSchedaForm(ActionForm form) {
		SchedaForm sf = (SchedaForm) form;
		return sf;
	}

	public static void loadListaClassificazioni(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		log.info("[FinregioActionHelper::loadListaClassificazioni] BEGIN");
		FinderService finderService = getFinderService();
		HttpSession session = getSession(request);
		Collection listaClassificazioni = (Collection) session
				.getAttribute("listaClassificazioni");
		if (listaClassificazioni == null) {
			listaClassificazioni = finderService.getListaClassificazioni();
			session.setAttribute("listaClassificazioni", listaClassificazioni);
		}
		request.setAttribute("listaClassificazioni", listaClassificazioni);
	}

	public static void loadListaSottoClassificazioni(
			HttpServletRequest request, ActionForm form)
			throws WebServiceException {
		FinderService finderService = getFinderService();
		HttpSession session = getSession(request);
		Collection listaSottoClassificazioni = new ArrayList();
		SchedaForm schedaForm = getSchedaForm(form);
		if (schedaForm.getClassificazione() != null
				&& !schedaForm.getClassificazione().equals("-1")) {
			Classificazione classificazione = new Classificazione();
			classificazione.setIdClassificazione(schedaForm
					.getClassificazione());
			try {
				loadSottoClassificazioniByClassificazione(request,
						classificazione);
			} catch (ServiceException e) {
				log.error(
						"[FinregioActionHelper::loadListaSottoClassificazioni]  "
								+ e.getMessage(), e);
				throw new WebServiceException(e.getMessage());
			}
		}
	}

	/**
	 * @param request
	 * @param s
	 * @param classificazione
	 * @throws ServiceException
	 */
	public static void loadSottoClassificazioniByClassificazione(
			HttpServletRequest request, Classificazione classificazione)
			throws ServiceException {
		FinregioService s = new ServiceLocator().getFinRegioService();
		Collection c = s
				.getListaSottoclassificazioniByClassificazione(classificazione);
		request.setAttribute("sottoclassificazioni", c);
	}

	/**
	 * @return
	 */
	public static FinderService getFinderService() {
		FinderService finderService = new FinderService();
		return finderService;
	}

	/**
	 * @param request
	 * @return
	 */
	public static HttpSession getSession(HttpServletRequest request) {
		HttpSession session = request.getSession(false);
		return session;
	}

	/**
	 * @param request
	 * @param form
	 * @throws WebServiceException
	 */
	public static void loadListaStati(HttpServletRequest request,
			ActionForm form) throws WebServiceException {
		FinderService finderService = getFinderService();
		HttpSession session = getSession(request);
		Collection listaStati = (Collection) session.getAttribute("listaStati");
		if (listaStati == null) {
			listaStati = finderService.getListaStati();
			session.setAttribute("listaStati", listaStati);
		}
		request.setAttribute("listaStati", listaStati);
	}

	public static void putForm(HttpServletRequest request,
			ActionMapping mapping, ActionForm form) {
		putForm(request,mapping.getScope(),mapping.getName(),form);
	}

	/**
	 * @param request
	 * @param mapping
	 * @param form
	 */
	public static void putForm(HttpServletRequest request,String scope,
			String formName, ActionForm form) {
		if (scope.equalsIgnoreCase("request")) {
			request.setAttribute(formName, form);
		}
		if (scope.equalsIgnoreCase("session")) {
			request.getSession(false).setAttribute(formName, form);

		}
	}
	
	/**
	 * @param request
	 */
	public static void putDataSavedMessage(HttpServletRequest request) {
		getSession(request).setAttribute("SAVED", messages.getString("alert.save"));
	}

	public static void putDataDeletedMessage(HttpServletRequest request) {
		getSession(request).setAttribute("SAVED", messages.getString("alert.delete"));		
	}

}
